package com.example.test.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * 自定义 invocation handler
 */
public class ProxyInvocationHandler<T> implements InvocationHandler {

    /**
     * principal: 被代理人，这里指被代理接口的实现类实例
     */
    private T principal;

    public void setPrincipal(T principal) {
        this.principal = principal;
    }

    /**
     * proxy: 代理人，这里指代理类的实例
     */
    public T getProxy() {
        // TODO: principal 非空判断
        return (T) Proxy.newProxyInstance(principal.getClass().getClassLoader(),
                principal.getClass().getInterfaces(), this);
    }

    /**
     * 借助反射调用principal中的方法并增强
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        // TODO: principal 非空判断
        beforeInvocation();
        Object result = method.invoke(principal, args);
        afterInvocation();
        return result;
    }

    private void beforeInvocation() {
        System.out.println("方法调用前的额外操作...");
    }

    private void afterInvocation() {
        System.out.println("方法调用后的额外操作...");
    }
}
